package com.library.service.impl;

import com.library.entity.Book;
import com.library.mapper.BookMapper;
import com.library.service.BookService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 图书服务实现类
 * 处理图书管理相关的业务逻辑
 */
@Service
public class BookServiceImpl implements BookService {

    @Resource
    private BookMapper bookMapper;

    /**
     * 新增图书
     * @param book 图书信息
     * @return 操作结果（true成功，false失败）
     */
    @Override
    @Transactional
    public boolean addBook(Book book) {
        // 验证ISBN唯一性
        Map<String, Object> condition = new HashMap<>();
        condition.put("isbn", book.getIsbn());
        List<Book> existingBooks = bookMapper.selectByCondition(condition);

        if (!existingBooks.isEmpty()) {
            // ISBN已存在，新增失败
            return false;
        }

        // 确保可借数量不大于总库存
        if (book.getAvailableQuantity() > book.getQuantity()) {
            book.setAvailableQuantity(book.getQuantity());
        }

        // 执行新增操作
        return bookMapper.insert(book) > 0;
    }

    /**
     * 更新图书信息
     * @param book 图书信息
     * @return 操作结果（true成功，false失败）
     */
    @Override
    @Transactional
    public boolean updateBook(Book book) {
        // 验证图书是否存在
        Book existingBook = bookMapper.selectById(book.getId());
        if (existingBook == null) {
            return false;
        }

        // 如果ISBN发生变更，验证新ISBN的唯一性
        if (!existingBook.getIsbn().equals(book.getIsbn())) {
            Map<String, Object> condition = new HashMap<>();
            condition.put("isbn", book.getIsbn());
            List<Book> booksWithSameIsbn = bookMapper.selectByCondition(condition);

            // 排除当前图书自身
            if (!booksWithSameIsbn.isEmpty() &&
                    !booksWithSameIsbn.get(0).getId().equals(book.getId())) {
                return false;
            }
        }

        // 确保可借数量不大于总库存
        if (book.getAvailableQuantity() > book.getQuantity()) {
            book.setAvailableQuantity(book.getQuantity());
        }

        // 执行更新操作
        return bookMapper.update(book) > 0;
    }

    /**
     * 删除图书
     * @param id 图书ID
     * @return 操作结果（true成功，false失败）
     */
    @Override
    @Transactional
    public boolean deleteBook(Long id) {
        // 验证图书是否存在
        Book book = bookMapper.selectById(id);
        if (book == null) {
            return false;
        }

        // 执行删除操作
        return bookMapper.deleteById(id) > 0;
    }

    /**
     * 根据ID查询图书
     * @param id 图书ID
     * @return 图书信息
     */
    @Override
    public Book getBookById(Long id) {
        return bookMapper.selectById(id);
    }

    /**
     * 根据条件搜索图书
     * @param condition 搜索条件（书名、作者、ISBN等）
     * @return 图书列表
     */
    @Override
    public List<Book> getBookByCondition(Map<String, Object> condition) {
        return bookMapper.selectByCondition(condition);
    }

    /**
     * 查询所有图书
     * @return 图书列表
     */
    @Override
    public List<Book> getAllBooks() {
        return bookMapper.selectAll();
    }
}
